package com.sz.common.base.dao;

import org.apache.ibatis.session.Configuration;

import java.sql.Connection;
import java.sql.Timestamp;
import java.util.List;

/**
 * Function: DAO接口 <br>
 * Author: hpeng.wang <br>
 * Date: 2016-11-01 14:11:00
 */
public interface Dao {

    /**
     * 保存对象.
     *
     * @param str 需要请求的名称
     * @param obj 参数名称
     * @return 保存的结果
     */
    int save(String str, Object obj);

    /**
     * 修改对象.
     *
     * @param str 需要请求的名称
     * @param obj 参数名称
     * @return 更新的结果
     */
    int update(String str, Object obj);

    /**
     * 删除对象.
     *
     * @param str 需要请求的名称
     * @param obj 参数名称
     * @return 删除的结果
     */
    int delete(String str, Object obj);

    /**
     * 查找对象.
     *
     * @param str 需要请求的名称
     * @param obj 参数名称
     * @return 查找的单个对象
     */
    Object findForObject(String str, Object obj);

    /**
     * 查找对象.
     *
     * @param <T>
     * @param str 需要请求的名称
     * @param obj 参数名称
     * @param clz 泛型化返回List
     * @return 查找的list对象
     */
    <T> List<T> findForList(String str, Object obj, Class<T> clz);

    /**
     * 查找对象封装成Map.
     *
     * @param sql sql语句
     * @param obj obj
     * @param key key
     * @return 结果
     */
    Object findForMap(String sql, Object obj, String key);

    /**
     * 批量插入信息.
     *
     * @param str  namespace
     * @param objs 要处理对象的集合
     */
    int batchInsert(String str, List<? extends Object> objs);

    /**
     * 批量更新信息.
     *
     * @param str  namespace
     * @param objs 要处理对象的集合
     */
    int batchUpdate(String str, List<? extends Object> objs);

    /**
     * 批量删除.
     *
     * @param str  命名空间
     * @param objs 要删除对象的list
     */
    int batchDelete(String str, List<? extends Object> objs);

    /**
     * 获取数据库中的时间
     *
     * @return
     */
    Timestamp getDbDate();

    /**
     * 获取Mybatis配置对象
     *
     * @return
     */
    Configuration getConfiguration();

    /**
     * 获取connection
     *
     * @return
     */
    Connection getConnection();

    /**
     * 查找对象
     * @param str
     * @param clz
     * @param <T>
     * @return
     */
    <T> List<T> findForList(String str, Class<T> clz);
}
